package com.ln.design.mode.behavior.interpret.example2;

import java.util.Stack;

/**
 * 解释器模式 实例二
 *
 * @Author zhangj
 * @Date 2022/12/3 14:47
 */
public class ExpressionMode {

    /**
     * 环境角色：
     * 这个角色的任务一般是用来存放文法中各个终结符所对应的具体值，比如R=R1+R2，我们给R1赋值100，给R2赋值200。
     * 这些信息需要存放到环境角色中，很多情况下我们使用Map来充当环境角色就足够了。
     */
    static class Context {
    }

    /**
     * 抽象解释器：<br/>
     * 声明一个所有具体表达式都要实现的抽象接口（或者抽象类），接口中主要是一个{@link Expression#interpreter(Context)}方法，称为解释操作。<br/>
     * 具体解释任务由它的各个实现类来完成，<br/>
     * 具体的解释器分别由终结符解释器{@link TerminalExpression}和非终结符解释器{@link NonTerminalExpression}完成。<br/>
     */
    static abstract class Expression {

        /**
         * 解释操作
         */
        public abstract Object interpreter(Context ctx);
    }

    /**
     * 终结符表达式：
     * 实现与文法中的元素相关联的解释操作，通常一个解释器模式中只有一个终结符表达式，但有多个实例，对应不同的终结符。
     * 终结符一半是文法中的运算单元，
     * 比如有一个简单的公式R=R1+R2，在里面R1和R2就是终结符，对应的解析R1和R2的解释器就是终结符表达式。
     */
    static class TerminalExpression extends Expression {

        @Override
        public Object interpreter(Context ctx) {
            return null;
        }
    }

    /**
     * 非终结符表达式：
     * 文法中的每条规则对应于一个非终结符表达式，非终结符表达式一般是文法中的运算符或者其他关键字，
     * 比如公式R=R1+R2中，+就是非终结符，解析+的解释器就是一个非终结符表达式。
     * 非终结符表达式根据逻辑的复杂程度而增加，原则上每个文法规则都对应一个非终结符表达式。
     */
    static class NonTerminalExpression extends Expression {

        public NonTerminalExpression(Expression... expressions) {
            //...
        }

        @Override
        public Object interpreter(Context ctx) {
            return null;
        }
    }

    public static void main(String[] args) {
        String expression = "";
        char[] charArray = expression.toCharArray();
        Context ctx = new Context();
        Stack<Expression> stack = new Stack<>();
        for (int i = 0; i < charArray.length; i++) {
            //进行语法判断，递归调用
        }
        Expression exp = stack.pop();
        exp.interpreter(ctx);
    }

}
